#include <bits/stdc++.h>
#include <unistd.h>
#include <signal.h>
using namespace std;


void PrintPending(const sigset_t& pending)
{
    for(int signo = 45;signo>0;signo--)
    {
        if(sigismember(&pending,signo))
        {
            cout<<"1";
        }
        else
        {
            cout<<0;
        }
    }
    cout<<"\n";
}

void handler(int signo)
{
    cout<<"get signal :"<<getpid()<<"  "<<signo<<endl;
    sleep(1);




    //测试单信号屏蔽
    // while(1)
    // {
    //     sigset_t pending;
    //     sigpending(&pending);
    //     PrintPending(pending);
    //     sleep(1);
    // }     
}

int main()
{
    ////测试多信号屏蔽和取消屏蔽
    signal(2,handler);
    signal(40,handler);
    signal(3,handler);
    signal(4,handler);
    signal(5,handler);

    sigset_t mask,omask;
    sigemptyset(&mask);
    sigemptyset(&omask);

    sigaddset(&mask,2);
    sigaddset(&mask,40);

    sigaddset(&mask,3);
    sigaddset(&mask,4);
    sigaddset(&mask,5);

    sigprocmask(SIG_SETMASK, &mask, &omask);

    int cnt = 20;
    while(1)
    {
        sleep(2);
        cout << getpid() << endl;

        sigset_t pending;
        sigpending(&pending);
        PrintPending(pending);

        // 取消屏蔽信号
        cnt--;
        cout<<"cnt:"<<cnt<<endl;
        sleep(1);
        if(cnt==0)
        {
            sigprocmask(SIG_SETMASK,&omask,nullptr);
            cout<<"cancel 2,3,4,5 block\n";
        }
    }


    //测试sigaction单信号屏蔽
    // cout<<"pid:"<<getpid()<<endl;

    // struct sigaction act ,oact;

    // sigemptyset(&act.sa_mask);
    // // sigaddset(&act.sa_mask,3);//用于添加附加阻塞信号

    // act.sa_handler= handler;
    // act.sa_flags = SA_NODEFER;
    // sigaction(2, &act, &oact);

    // while(1)
    // {
    //     sleep(1);
    //     std::cout << "屏蔽二号信号 By sigaction\n";
    // }
    return 0;
}